package com.rulai.generator.plugin.terminator;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.rulai.generator.plugin.SkeletonProject;

import cn.hutool.core.io.FileUtil;
import cn.hutool.system.OsInfo;

/**
 * maven项目 <功能详细描述>
 * 
 * @since [产品/模块版本]
 * @author leiyang@qding.me
 * @version v1.0 Date:2018年5月9日 上午10:00:40
 */
public abstract class MavenSkeletonProject implements SkeletonProject {

    private static final Logger LOG = LoggerFactory.getLogger(MavenSkeletonProject.class);

    /**
     * repeatDel 文件重复删除
     */
    private boolean repeatDel = true;

    /**
     * projectPath 项目路径
     */
    private String projectPath;

    /**
     * modelVersion
     */
    private String modelVersion = "4.0.0";

    /**
     * version 项目版本
     */
    private String version;

    /**
     * groupId 项目所属组
     */
    private String groupId;

    /**
     * artifactId 项目版本
     */
    private String artifactId;

    /**
     * parentGroupId 父项目
     */
    private String parentGroupId;

    /**
     * parentArtifactId 父项目
     */
    private String parentArtifactId;

    /**
     * osInfo 系统信息
     */
    protected static final OsInfo osInfo = new OsInfo();

    public MavenSkeletonProject(String projectPath, boolean repeatDel) {
        this.projectPath = projectPath;
        this.repeatDel = repeatDel;
    }

    @Override
    public void build() throws Exception {

        // 创建目录
        createDir();

        fillingContent();

    }

    /**
     * 填充项目内容 <功能详细描述>
     * 
     * @author leiyang@qding.me
     * @throws Exception
     *             抛出异常 Date:2018年5月9日 下午12:18:53
     */
    protected abstract void fillingContent() throws Exception;

    /**
     * 创建建工程目录 <功能详细描述>
     * 
     * @author leiyang@qding.me Date:2018年5月9日 上午10:40:48
     */
    private void createDir() {

        String mainJavaPath = this.getMainJavaPath();
        String mainResPath = this.getMainResPath();
        String testJavaPath = this.getestJavaPath();
        String testResPath = this.getestResPath();

        LOG.info("#####mainJavaPath:[{}],mainResPath:[{}],testJavaPath:[{}],testResPath:[{}]", mainJavaPath,
                mainResPath, testJavaPath, testResPath);

        if (!FileUtil.exist(mainJavaPath)) {
            FileUtil.mkdir(mainJavaPath);
        } else if (repeatDel) {
            FileUtil.del(mainJavaPath);
            FileUtil.mkdir(mainJavaPath);
        }

        if (!FileUtil.exist(mainResPath)) {
            FileUtil.mkdir(mainResPath);
        } else if (repeatDel) {
            FileUtil.del(mainResPath);
            FileUtil.mkdir(mainResPath);
        }

        if (!FileUtil.exist(testJavaPath)) {
            FileUtil.mkdir(testJavaPath);
        } else if (repeatDel) {
            FileUtil.del(testJavaPath);
            FileUtil.mkdir(testJavaPath);
        }

        if (!FileUtil.exist(testResPath)) {
            FileUtil.mkdir(testResPath);
        } else if (repeatDel) {
            FileUtil.del(testResPath);
            FileUtil.mkdir(testResPath);
        }

    }

    /**
     * 获取java资源路径 <功能详细描述>
     * 
     * @return
     * @author leiyang@qding.me Date:2018年5月9日 上午10:05:57
     */
    protected String getMainJavaPath() {

        return this.projectPath + osInfo.getFileSeparator() + this.getArtifactId() + osInfo.getFileSeparator() + "src"
                + osInfo.getFileSeparator() + "main" + osInfo.getFileSeparator() + "java";
    }

    /**
     * 获取main resources路径。 <功能详细描述>
     * 
     * @return
     * @author leiyang@qding.me Date:2018年5月9日 上午10:07:39
     */
    protected String getMainResPath() {
        return this.projectPath + osInfo.getFileSeparator() + this.getArtifactId() + osInfo.getFileSeparator() + "src"
                + osInfo.getFileSeparator() + "main" + osInfo.getFileSeparator() + "resources";
    }

    /**
     * 获取测试java路径 <功能详细描述>
     * 
     * @return
     * @author leiyang@qding.me Date:2018年5月9日 上午10:09:41
     */
    protected String getestJavaPath() {
        return this.projectPath + osInfo.getFileSeparator() + this.getArtifactId() + osInfo.getFileSeparator() + "src"
                + osInfo.getFileSeparator() + "test" + osInfo.getFileSeparator() + "java";
    }

    /**
     * 获取测试资源路径 <功能详细描述>
     * 
     * @return
     * @author leiyang@qding.me Date:2018年5月9日 上午10:11:37
     */
    protected String getestResPath() {
        return this.projectPath + osInfo.getFileSeparator() + this.getArtifactId() + osInfo.getFileSeparator() + "src"
                + osInfo.getFileSeparator() + "test" + osInfo.getFileSeparator() + "resources";

    }

    public String getGroupId() {
        return groupId;
    }

    public void setGroupId(String groupId) {
        this.groupId = groupId;
    }

    public String getArtifactId() {
        return artifactId;
    }

    public void setArtifactId(String artifactId) {
        this.artifactId = artifactId;
    }

}
